<?php
/**
 * NegativeKeywordsApi
 * PHP version 5
 *
 * @category Class
 * @package  AmazonAdvertisingApi
 * @author   vv_guo
 * @link    https://gitee.com/HuaLiLiDeDiDiao/amazon-advertising-api
 */

/**
 * Amazon Ads API - Sponsored Brands
 *
 * Use the Amazon Ads API for Sponsored Brands for campaign, ad group, keyword, negative keyword, drafts, Stores, landing pages, and Brands management operations. For more information about Sponsored Brands, see the [Sponsored Brands Support Center](https://advertising.amazon.com/help#GQFZA83P55P747BZ). For onboarding information, see the [account setup](https://advertising.amazon.com/API/docs/v3/guides/account_setup) topic.
 *
 * OpenAPI spec version: 3.0
 * 
 * Generated by:https://gitee.com/HuaLiLiDeDiDiao/amazon-advertising-api.git
 * AmazonAdvertisingApi Codegen version: 3.0.51
 */
/**
 * NOTE: This class is auto generated by the AmazonAdvertisingApi code generator program.
 *https://gitee.com/HuaLiLiDeDiDiao/amazon-advertising-api
 * Do not edit the class manually.
 */

namespace AmazonAdvertisingApi\Api;

use GuzzleHttp\Client;
use GuzzleHttp\ClientInterface;
use GuzzleHttp\Exception\RequestException;
use GuzzleHttp\Psr7\MultipartStream;
use GuzzleHttp\Psr7\Request;
use GuzzleHttp\RequestOptions;
use AmazonAdvertisingApi\ApiException;
use AmazonAdvertisingApi\Configuration;
use AmazonAdvertisingApi\HeaderSelector;
use AmazonAdvertisingApi\ObjectSerializer;

/**
 * NegativeKeywordsApi Class Doc Comment
 *
 * @category Class
 * @package  AmazonAdvertisingApi
 * @author   vv_guo
 * @link    https://gitee.com/HuaLiLiDeDiDiao/amazon-advertising-api
 */
class NegativeKeywordsApi
{
    /**
     * @var ClientInterface
     */
    protected $client;

    /**
     * @var Configuration
     */
    protected $config;

    /**
     * @var HeaderSelector
     */
    protected $headerSelector;

    /**
     * @param ClientInterface $client
     * @param Configuration   $config
     * @param HeaderSelector  $selector
     */
    public function __construct(
        ClientInterface $client = null,
        Configuration $config = null,
        HeaderSelector $selector = null
    ) {
        $this->client = $client ?: new Client();
        $this->config = $config ?: new Configuration();
        $this->headerSelector = $selector ?: new HeaderSelector();
    }

    /**
     * @return Configuration
     */
    public function getConfig()
    {
        return $this->config;
    }

    /**
     * Operation archiveNegativeKeyword
     *
     * Archives a negative keyword specified by identifier.
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  int $keyword_id The identifier of an existing campaign. (required)
     *
     * @throws \AmazonAdvertisingApi\ApiException on non-2xx response
     * @throws \InvalidArgumentException
     * @return \AmazonAdvertisingApi\Model\SBKeywordResponse
     */
    public function archiveNegativeKeyword($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $keyword_id)
    {
        list($response) = $this->archiveNegativeKeywordWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $keyword_id);
        return $response;
    }

    /**
     * Operation archiveNegativeKeywordWithHttpInfo
     *
     * Archives a negative keyword specified by identifier.
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  int $keyword_id The identifier of an existing campaign. (required)
     *
     * @throws \AmazonAdvertisingApi\ApiException on non-2xx response
     * @throws \InvalidArgumentException
     * @return array of \AmazonAdvertisingApi\Model\SBKeywordResponse, HTTP status code, HTTP response headers (array of strings)
     */
    public function archiveNegativeKeywordWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $keyword_id)
    {
        $returnType = '\AmazonAdvertisingApi\Model\SBKeywordResponse';
        $request = $this->archiveNegativeKeywordRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $keyword_id);

        try {
            $options = $this->createHttpClientOption();
            try {
                $response = $this->client->send($request, $options);
            } catch (RequestException $e) {
                throw new ApiException(
                    "[{$e->getCode()}] {$e->getMessage()}",
                    $e->getCode(),
                    $e->getResponse() ? $e->getResponse()->getHeaders() : null,
                    $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null
                );
            }

            $statusCode = $response->getStatusCode();

            if ($statusCode < 200 || $statusCode > 299) {
                throw new ApiException(
                    sprintf(
                        '[%d] Error connecting to the API (%s)',
                        $statusCode,
                        $request->getUri()
                    ),
                    $statusCode,
                    $response->getHeaders(),
                    $response->getBody()
                );
            }

            $responseBody = $response->getBody();
            if ($returnType === '\SplFileObject') {
                $content = $responseBody; //stream goes to serializer
            } else {
                $content = $responseBody->getContents();
                if (!in_array($returnType, ['string','integer','bool'])) {
                    $content = json_decode($content);
                }
            }

            return [
                ObjectSerializer::deserialize($content, $returnType, []),
                $response->getStatusCode(),
                $response->getHeaders()
            ];

        } catch (ApiException $e) {
            switch ($e->getCode()) {
                case 200:
                    $data = ObjectSerializer::deserialize(
                        $e->getResponseBody(),
                        '\AmazonAdvertisingApi\Model\SBKeywordResponse',
                        $e->getResponseHeaders()
                    );
                    $e->setResponseObject($data);
                    break;
                case 404:
                    $data = ObjectSerializer::deserialize(
                        $e->getResponseBody(),
                        '\AmazonAdvertisingApi\Model\Error',
                        $e->getResponseHeaders()
                    );
                    $e->setResponseObject($data);
                    break;
            }
            throw $e;
        }
    }

    /**
     * Operation archiveNegativeKeywordAsync
     *
     * Archives a negative keyword specified by identifier.
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  int $keyword_id The identifier of an existing campaign. (required)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Promise\PromiseInterface
     */
    public function archiveNegativeKeywordAsync($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $keyword_id)
    {
        return $this->archiveNegativeKeywordAsyncWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $keyword_id)
            ->then(
                function ($response) {
                    return $response[0];
                }
            );
    }

    /**
     * Operation archiveNegativeKeywordAsyncWithHttpInfo
     *
     * Archives a negative keyword specified by identifier.
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  int $keyword_id The identifier of an existing campaign. (required)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Promise\PromiseInterface
     */
    public function archiveNegativeKeywordAsyncWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $keyword_id)
    {
        $returnType = '\AmazonAdvertisingApi\Model\SBKeywordResponse';
        $request = $this->archiveNegativeKeywordRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $keyword_id);

        return $this->client
            ->sendAsync($request, $this->createHttpClientOption())
            ->then(
                function ($response) use ($returnType) {
                    $responseBody = $response->getBody();
                    if ($returnType === '\SplFileObject') {
                        $content = $responseBody; //stream goes to serializer
                    } else {
                        $content = $responseBody->getContents();
                        if ($returnType !== 'string') {
                            $content = json_decode($content);
                        }
                    }

                    return [
                        ObjectSerializer::deserialize($content, $returnType, []),
                        $response->getStatusCode(),
                        $response->getHeaders()
                    ];
                },
                function ($exception) {
                    $response = $exception->getResponse();
                    $statusCode = $response->getStatusCode();
                    throw new ApiException(
                        sprintf(
                            '[%d] Error connecting to the API (%s)',
                            $statusCode,
                            $exception->getRequest()->getUri()
                        ),
                        $statusCode,
                        $response->getHeaders(),
                        $response->getBody()
                    );
                }
            );
    }

    /**
     * Create request for operation 'archiveNegativeKeyword'
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  int $keyword_id The identifier of an existing campaign. (required)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Psr7\Request
     */
    protected function archiveNegativeKeywordRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $keyword_id)
    {
        // verify the required parameter 'amazon_advertising_api_client_id' is set
        if ($amazon_advertising_api_client_id === null || (is_array($amazon_advertising_api_client_id) && count($amazon_advertising_api_client_id) === 0)) {
            throw new \InvalidArgumentException(
                'Missing the required parameter $amazon_advertising_api_client_id when calling archiveNegativeKeyword'
            );
        }
        // verify the required parameter 'amazon_advertising_api_scope' is set
        if ($amazon_advertising_api_scope === null || (is_array($amazon_advertising_api_scope) && count($amazon_advertising_api_scope) === 0)) {
            throw new \InvalidArgumentException(
                'Missing the required parameter $amazon_advertising_api_scope when calling archiveNegativeKeyword'
            );
        }
        // verify the required parameter 'keyword_id' is set
        if ($keyword_id === null || (is_array($keyword_id) && count($keyword_id) === 0)) {
            throw new \InvalidArgumentException(
                'Missing the required parameter $keyword_id when calling archiveNegativeKeyword'
            );
        }

        $resourcePath = '/sb/negativeKeywords/{keywordId}';
        $formParams = [];
        $queryParams = [];
        $headerParams = [];
        $httpBody = '';
        $multipart = false;

        // header params
        if ($amazon_advertising_api_client_id !== null) {
            $headerParams['Amazon-Advertising-API-ClientId'] = ObjectSerializer::toHeaderValue($amazon_advertising_api_client_id);
        }
        // header params
        if ($amazon_advertising_api_scope !== null) {
            $headerParams['Amazon-Advertising-API-Scope'] = ObjectSerializer::toHeaderValue($amazon_advertising_api_scope);
        }

        // path params
        if ($keyword_id !== null) {
            $resourcePath = str_replace(
                '{' . 'keywordId' . '}',
                ObjectSerializer::toPathValue($keyword_id),
                $resourcePath
            );
        }

        // body params
        $_tempBody = null;

        if ($multipart) {
            $headers = $this->headerSelector->selectHeadersForMultipart(
                ['application/vnd.sbkeywordresponse.v3+json', 'application/vnd.error.v3+json']
            );
        } else {
            $headers = $this->headerSelector->selectHeaders(
                ['application/vnd.sbkeywordresponse.v3+json', 'application/vnd.error.v3+json'],
                []
            );
        }

        // for model (json/xml)
        if (isset($_tempBody)) {
            // $_tempBody is the method argument, if present
            $httpBody = $_tempBody;
            // \stdClass has no __toString(), so we should encode it manually
            if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') {
                $httpBody = \GuzzleHttp\json_encode($httpBody);
            }
        } elseif (count($formParams) > 0) {
            if ($multipart) {
                $multipartContents = [];
                foreach ($formParams as $formParamName => $formParamValue) {
                    $multipartContents[] = [
                        'name' => $formParamName,
                        'contents' => $formParamValue
                    ];
                }
                // for HTTP post (form)
                $httpBody = new MultipartStream($multipartContents);

            } elseif ($headers['Content-Type'] === 'application/json') {
                $httpBody = \GuzzleHttp\json_encode($formParams);

            } else {
                // for HTTP post (form)
                $httpBody = \GuzzleHttp\Psr7\Query::build($formParams);
            }
        }

            // // this endpoint requires Bearer token
            if ($this->config->getAccessToken() !== null) {
            $headers['Authorization'] = 'Bearer ' . $this->config->getAccessToken();
            }

        $defaultHeaders = [];
        if ($this->config->getUserAgent()) {
            $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
        }

        $headers = array_merge(
            $defaultHeaders,
            $headerParams,
            $headers
        );

        $query = \GuzzleHttp\Psr7\Query::build($queryParams);
        return new Request(
            'DELETE',
            $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''),
            $headers,
            $httpBody
        );
    }

    /**
     * Operation createNegativeKeywords
     *
     * Creates one or more negative keywords.
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  \AmazonAdvertisingApi\Model\SbNegativeKeywordsBody1[] $body An array of negative keywords. (optional)
     *
     * @throws \AmazonAdvertisingApi\ApiException on non-2xx response
     * @throws \InvalidArgumentException
     * @return \AmazonAdvertisingApi\Model\SBKeywordResponse[]
     */
    public function createNegativeKeywords($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        list($response) = $this->createNegativeKeywordsWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body);
        return $response;
    }

    /**
     * Operation createNegativeKeywordsWithHttpInfo
     *
     * Creates one or more negative keywords.
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  \AmazonAdvertisingApi\Model\SbNegativeKeywordsBody1[] $body An array of negative keywords. (optional)
     *
     * @throws \AmazonAdvertisingApi\ApiException on non-2xx response
     * @throws \InvalidArgumentException
     * @return array of \AmazonAdvertisingApi\Model\SBKeywordResponse[], HTTP status code, HTTP response headers (array of strings)
     */
    public function createNegativeKeywordsWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        $returnType = '\AmazonAdvertisingApi\Model\SBKeywordResponse[]';
        $request = $this->createNegativeKeywordsRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body);

        try {
            $options = $this->createHttpClientOption();
            try {
                $response = $this->client->send($request, $options);
            } catch (RequestException $e) {
                throw new ApiException(
                    "[{$e->getCode()}] {$e->getMessage()}",
                    $e->getCode(),
                    $e->getResponse() ? $e->getResponse()->getHeaders() : null,
                    $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null
                );
            }

            $statusCode = $response->getStatusCode();

            if ($statusCode < 200 || $statusCode > 299) {
                throw new ApiException(
                    sprintf(
                        '[%d] Error connecting to the API (%s)',
                        $statusCode,
                        $request->getUri()
                    ),
                    $statusCode,
                    $response->getHeaders(),
                    $response->getBody()
                );
            }

            $responseBody = $response->getBody();
            if ($returnType === '\SplFileObject') {
                $content = $responseBody; //stream goes to serializer
            } else {
                $content = $responseBody->getContents();
                if (!in_array($returnType, ['string','integer','bool'])) {
                    $content = json_decode($content);
                }
            }

            return [
                ObjectSerializer::deserialize($content, $returnType, []),
                $response->getStatusCode(),
                $response->getHeaders()
            ];

        } catch (ApiException $e) {
            switch ($e->getCode()) {
                case 207:
                    $data = ObjectSerializer::deserialize(
                        $e->getResponseBody(),
                        '\AmazonAdvertisingApi\Model\SBKeywordResponse[]',
                        $e->getResponseHeaders()
                    );
                    $e->setResponseObject($data);
                    break;
            }
            throw $e;
        }
    }

    /**
     * Operation createNegativeKeywordsAsync
     *
     * Creates one or more negative keywords.
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  \AmazonAdvertisingApi\Model\SbNegativeKeywordsBody1[] $body An array of negative keywords. (optional)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Promise\PromiseInterface
     */
    public function createNegativeKeywordsAsync($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        return $this->createNegativeKeywordsAsyncWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body)
            ->then(
                function ($response) {
                    return $response[0];
                }
            );
    }

    /**
     * Operation createNegativeKeywordsAsyncWithHttpInfo
     *
     * Creates one or more negative keywords.
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  \AmazonAdvertisingApi\Model\SbNegativeKeywordsBody1[] $body An array of negative keywords. (optional)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Promise\PromiseInterface
     */
    public function createNegativeKeywordsAsyncWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        $returnType = '\AmazonAdvertisingApi\Model\SBKeywordResponse[]';
        $request = $this->createNegativeKeywordsRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body);

        return $this->client
            ->sendAsync($request, $this->createHttpClientOption())
            ->then(
                function ($response) use ($returnType) {
                    $responseBody = $response->getBody();
                    if ($returnType === '\SplFileObject') {
                        $content = $responseBody; //stream goes to serializer
                    } else {
                        $content = $responseBody->getContents();
                        if ($returnType !== 'string') {
                            $content = json_decode($content);
                        }
                    }

                    return [
                        ObjectSerializer::deserialize($content, $returnType, []),
                        $response->getStatusCode(),
                        $response->getHeaders()
                    ];
                },
                function ($exception) {
                    $response = $exception->getResponse();
                    $statusCode = $response->getStatusCode();
                    throw new ApiException(
                        sprintf(
                            '[%d] Error connecting to the API (%s)',
                            $statusCode,
                            $exception->getRequest()->getUri()
                        ),
                        $statusCode,
                        $response->getHeaders(),
                        $response->getBody()
                    );
                }
            );
    }

    /**
     * Create request for operation 'createNegativeKeywords'
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  \AmazonAdvertisingApi\Model\SbNegativeKeywordsBody1[] $body An array of negative keywords. (optional)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Psr7\Request
     */
    protected function createNegativeKeywordsRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        // verify the required parameter 'amazon_advertising_api_client_id' is set
        if ($amazon_advertising_api_client_id === null || (is_array($amazon_advertising_api_client_id) && count($amazon_advertising_api_client_id) === 0)) {
            throw new \InvalidArgumentException(
                'Missing the required parameter $amazon_advertising_api_client_id when calling createNegativeKeywords'
            );
        }
        // verify the required parameter 'amazon_advertising_api_scope' is set
        if ($amazon_advertising_api_scope === null || (is_array($amazon_advertising_api_scope) && count($amazon_advertising_api_scope) === 0)) {
            throw new \InvalidArgumentException(
                'Missing the required parameter $amazon_advertising_api_scope when calling createNegativeKeywords'
            );
        }

        $resourcePath = '/sb/negativeKeywords';
        $formParams = [];
        $queryParams = [];
        $headerParams = [];
        $httpBody = '';
        $multipart = false;

        // header params
        if ($amazon_advertising_api_client_id !== null) {
            $headerParams['Amazon-Advertising-API-ClientId'] = ObjectSerializer::toHeaderValue($amazon_advertising_api_client_id);
        }
        // header params
        if ($amazon_advertising_api_scope !== null) {
            $headerParams['Amazon-Advertising-API-Scope'] = ObjectSerializer::toHeaderValue($amazon_advertising_api_scope);
        }


        // body params
        $_tempBody = null;
        if (isset($body)) {
            $_tempBody = $body;
        }

        if ($multipart) {
            $headers = $this->headerSelector->selectHeadersForMultipart(
                ['application/vnd.sbkeywordresponse.v3+json']
            );
        } else {
            $headers = $this->headerSelector->selectHeaders(
                ['application/vnd.sbkeywordresponse.v3+json'],
                ['application/json']
            );
        }

        // for model (json/xml)
        if (isset($_tempBody)) {
            // $_tempBody is the method argument, if present
            $httpBody = $_tempBody;
            // \stdClass has no __toString(), so we should encode it manually
            if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') {
                $httpBody = \GuzzleHttp\json_encode($httpBody);
            }
        } elseif (count($formParams) > 0) {
            if ($multipart) {
                $multipartContents = [];
                foreach ($formParams as $formParamName => $formParamValue) {
                    $multipartContents[] = [
                        'name' => $formParamName,
                        'contents' => $formParamValue
                    ];
                }
                // for HTTP post (form)
                $httpBody = new MultipartStream($multipartContents);

            } elseif ($headers['Content-Type'] === 'application/json') {
                $httpBody = \GuzzleHttp\json_encode($formParams);

            } else {
                // for HTTP post (form)
                $httpBody = \GuzzleHttp\Psr7\Query::build($formParams);
            }
        }

            // // this endpoint requires Bearer token
            if ($this->config->getAccessToken() !== null) {
            $headers['Authorization'] = 'Bearer ' . $this->config->getAccessToken();
            }

        $defaultHeaders = [];
        if ($this->config->getUserAgent()) {
            $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
        }

        $headers = array_merge(
            $defaultHeaders,
            $headerParams,
            $headers
        );

        $query = \GuzzleHttp\Psr7\Query::build($queryParams);
        return new Request(
            'POST',
            $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''),
            $headers,
            $httpBody
        );
    }

    /**
     * Operation getNegativeKeyword
     *
     * Gets a negative keyword specified by identifier.
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  int $keyword_id The identifier of an existing negative keyword. (required)
     *
     * @throws \AmazonAdvertisingApi\ApiException on non-2xx response
     * @throws \InvalidArgumentException
     * @return \AmazonAdvertisingApi\Model\InlineResponse2002
     */
    public function getNegativeKeyword($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $keyword_id)
    {
        list($response) = $this->getNegativeKeywordWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $keyword_id);
        return $response;
    }

    /**
     * Operation getNegativeKeywordWithHttpInfo
     *
     * Gets a negative keyword specified by identifier.
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  int $keyword_id The identifier of an existing negative keyword. (required)
     *
     * @throws \AmazonAdvertisingApi\ApiException on non-2xx response
     * @throws \InvalidArgumentException
     * @return array of \AmazonAdvertisingApi\Model\InlineResponse2002, HTTP status code, HTTP response headers (array of strings)
     */
    public function getNegativeKeywordWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $keyword_id)
    {
        $returnType = '\AmazonAdvertisingApi\Model\InlineResponse2002';
        $request = $this->getNegativeKeywordRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $keyword_id);

        try {
            $options = $this->createHttpClientOption();
            try {
                $response = $this->client->send($request, $options);
            } catch (RequestException $e) {
                throw new ApiException(
                    "[{$e->getCode()}] {$e->getMessage()}",
                    $e->getCode(),
                    $e->getResponse() ? $e->getResponse()->getHeaders() : null,
                    $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null
                );
            }

            $statusCode = $response->getStatusCode();

            if ($statusCode < 200 || $statusCode > 299) {
                throw new ApiException(
                    sprintf(
                        '[%d] Error connecting to the API (%s)',
                        $statusCode,
                        $request->getUri()
                    ),
                    $statusCode,
                    $response->getHeaders(),
                    $response->getBody()
                );
            }

            $responseBody = $response->getBody();
            if ($returnType === '\SplFileObject') {
                $content = $responseBody; //stream goes to serializer
            } else {
                $content = $responseBody->getContents();
                if (!in_array($returnType, ['string','integer','bool'])) {
                    $content = json_decode($content);
                }
            }

            return [
                ObjectSerializer::deserialize($content, $returnType, []),
                $response->getStatusCode(),
                $response->getHeaders()
            ];

        } catch (ApiException $e) {
            switch ($e->getCode()) {
                case 200:
                    $data = ObjectSerializer::deserialize(
                        $e->getResponseBody(),
                        '\AmazonAdvertisingApi\Model\InlineResponse2002',
                        $e->getResponseHeaders()
                    );
                    $e->setResponseObject($data);
                    break;
            }
            throw $e;
        }
    }

    /**
     * Operation getNegativeKeywordAsync
     *
     * Gets a negative keyword specified by identifier.
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  int $keyword_id The identifier of an existing negative keyword. (required)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Promise\PromiseInterface
     */
    public function getNegativeKeywordAsync($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $keyword_id)
    {
        return $this->getNegativeKeywordAsyncWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $keyword_id)
            ->then(
                function ($response) {
                    return $response[0];
                }
            );
    }

    /**
     * Operation getNegativeKeywordAsyncWithHttpInfo
     *
     * Gets a negative keyword specified by identifier.
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  int $keyword_id The identifier of an existing negative keyword. (required)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Promise\PromiseInterface
     */
    public function getNegativeKeywordAsyncWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $keyword_id)
    {
        $returnType = '\AmazonAdvertisingApi\Model\InlineResponse2002';
        $request = $this->getNegativeKeywordRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $keyword_id);

        return $this->client
            ->sendAsync($request, $this->createHttpClientOption())
            ->then(
                function ($response) use ($returnType) {
                    $responseBody = $response->getBody();
                    if ($returnType === '\SplFileObject') {
                        $content = $responseBody; //stream goes to serializer
                    } else {
                        $content = $responseBody->getContents();
                        if ($returnType !== 'string') {
                            $content = json_decode($content);
                        }
                    }

                    return [
                        ObjectSerializer::deserialize($content, $returnType, []),
                        $response->getStatusCode(),
                        $response->getHeaders()
                    ];
                },
                function ($exception) {
                    $response = $exception->getResponse();
                    $statusCode = $response->getStatusCode();
                    throw new ApiException(
                        sprintf(
                            '[%d] Error connecting to the API (%s)',
                            $statusCode,
                            $exception->getRequest()->getUri()
                        ),
                        $statusCode,
                        $response->getHeaders(),
                        $response->getBody()
                    );
                }
            );
    }

    /**
     * Create request for operation 'getNegativeKeyword'
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  int $keyword_id The identifier of an existing negative keyword. (required)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Psr7\Request
     */
    protected function getNegativeKeywordRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $keyword_id)
    {
        // verify the required parameter 'amazon_advertising_api_client_id' is set
        if ($amazon_advertising_api_client_id === null || (is_array($amazon_advertising_api_client_id) && count($amazon_advertising_api_client_id) === 0)) {
            throw new \InvalidArgumentException(
                'Missing the required parameter $amazon_advertising_api_client_id when calling getNegativeKeyword'
            );
        }
        // verify the required parameter 'amazon_advertising_api_scope' is set
        if ($amazon_advertising_api_scope === null || (is_array($amazon_advertising_api_scope) && count($amazon_advertising_api_scope) === 0)) {
            throw new \InvalidArgumentException(
                'Missing the required parameter $amazon_advertising_api_scope when calling getNegativeKeyword'
            );
        }
        // verify the required parameter 'keyword_id' is set
        if ($keyword_id === null || (is_array($keyword_id) && count($keyword_id) === 0)) {
            throw new \InvalidArgumentException(
                'Missing the required parameter $keyword_id when calling getNegativeKeyword'
            );
        }

        $resourcePath = '/sb/negativeKeywords/{keywordId}';
        $formParams = [];
        $queryParams = [];
        $headerParams = [];
        $httpBody = '';
        $multipart = false;

        // header params
        if ($amazon_advertising_api_client_id !== null) {
            $headerParams['Amazon-Advertising-API-ClientId'] = ObjectSerializer::toHeaderValue($amazon_advertising_api_client_id);
        }
        // header params
        if ($amazon_advertising_api_scope !== null) {
            $headerParams['Amazon-Advertising-API-Scope'] = ObjectSerializer::toHeaderValue($amazon_advertising_api_scope);
        }

        // path params
        if ($keyword_id !== null) {
            $resourcePath = str_replace(
                '{' . 'keywordId' . '}',
                ObjectSerializer::toPathValue($keyword_id),
                $resourcePath
            );
        }

        // body params
        $_tempBody = null;

        if ($multipart) {
            $headers = $this->headerSelector->selectHeadersForMultipart(
                ['application/vnd.sbnegativekeyword.v3+json']
            );
        } else {
            $headers = $this->headerSelector->selectHeaders(
                ['application/vnd.sbnegativekeyword.v3+json'],
                []
            );
        }

        // for model (json/xml)
        if (isset($_tempBody)) {
            // $_tempBody is the method argument, if present
            $httpBody = $_tempBody;
            // \stdClass has no __toString(), so we should encode it manually
            if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') {
                $httpBody = \GuzzleHttp\json_encode($httpBody);
            }
        } elseif (count($formParams) > 0) {
            if ($multipart) {
                $multipartContents = [];
                foreach ($formParams as $formParamName => $formParamValue) {
                    $multipartContents[] = [
                        'name' => $formParamName,
                        'contents' => $formParamValue
                    ];
                }
                // for HTTP post (form)
                $httpBody = new MultipartStream($multipartContents);

            } elseif ($headers['Content-Type'] === 'application/json') {
                $httpBody = \GuzzleHttp\json_encode($formParams);

            } else {
                // for HTTP post (form)
                $httpBody = \GuzzleHttp\Psr7\Query::build($formParams);
            }
        }

            // // this endpoint requires Bearer token
            if ($this->config->getAccessToken() !== null) {
            $headers['Authorization'] = 'Bearer ' . $this->config->getAccessToken();
            }

        $defaultHeaders = [];
        if ($this->config->getUserAgent()) {
            $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
        }

        $headers = array_merge(
            $defaultHeaders,
            $headerParams,
            $headers
        );

        $query = \GuzzleHttp\Psr7\Query::build($queryParams);
        return new Request(
            'GET',
            $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''),
            $headers,
            $httpBody
        );
    }

    /**
     * Operation listNegativeKeywords
     *
     * Gets an array of negative keywords, filtered by optional criteria.
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  int $start_index Sets a zero-based offset into the requested set of negative keywords. Use in conjunction with the &#x60;count&#x60; parameter to control pagination of the returned array. (optional, default to 0)
     * @param  int $count Sets the number of negative keywords in the returned array. Use in conjunction with the &#x60;startIndex&#x60; parameter to control pagination. For example, to return the first ten negative keywords set &#x60;startIndex&#x3D;0&#x60; and &#x60;count&#x3D;10&#x60;. To return the next ten negative keywords, set &#x60;startIndex&#x3D;10&#x60; and &#x60;count&#x3D;10&#x60;, and so on. (optional)
     * @param  \AmazonAdvertisingApi\Model\NegativeMatchType $match_type_filter The returned array is filtered to include only negative keywords with &#x60;matchType&#x60; set to one of the values in the specified comma-delimited list. (optional)
     * @param  string $keyword_text The returned array includes only negative keywords with the specified text. (optional)
     * @param  \AmazonAdvertisingApi\Model\State $state_filter The returned array includes only negative keywords with &#x60;state&#x60; set to the specified value. (optional)
     * @param  string $campaign_id_filter The returned array includes only negative keywords associated with campaigns matching those specified by identifier in the comma-delimited string. (optional)
     * @param  string $ad_group_id_filter The returned array includes only negative keywords associated with ad groups matching those specified by identifier in the comma-delimited string. (optional)
     * @param  string $keyword_id_filter The returned array includes only negative keywords with identifiers matching those specified in the comma-delimited string. (optional)
     * @param  \AmazonAdvertisingApi\Model\CreativeType $creative_type Filter by the type of creative the campaign is associated with. To get negative keywords associated with non-video campaigns specify &#x27;productCollection&#x27;. To get negative keywords associated with video campaigns, this must be set to &#x27;video&#x27;. Returns all negative keywords if not specified. (optional)
     *
     * @throws \AmazonAdvertisingApi\ApiException on non-2xx response
     * @throws \InvalidArgumentException
     * @return \AmazonAdvertisingApi\Model\SBNegativeKeyword[]
     */
    public function listNegativeKeywords($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $start_index = '0', $count = null, $match_type_filter = null, $keyword_text = null, $state_filter = null, $campaign_id_filter = null, $ad_group_id_filter = null, $keyword_id_filter = null, $creative_type = null)
    {
        list($response) = $this->listNegativeKeywordsWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $start_index, $count, $match_type_filter, $keyword_text, $state_filter, $campaign_id_filter, $ad_group_id_filter, $keyword_id_filter, $creative_type);
        return $response;
    }

    /**
     * Operation listNegativeKeywordsWithHttpInfo
     *
     * Gets an array of negative keywords, filtered by optional criteria.
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  int $start_index Sets a zero-based offset into the requested set of negative keywords. Use in conjunction with the &#x60;count&#x60; parameter to control pagination of the returned array. (optional, default to 0)
     * @param  int $count Sets the number of negative keywords in the returned array. Use in conjunction with the &#x60;startIndex&#x60; parameter to control pagination. For example, to return the first ten negative keywords set &#x60;startIndex&#x3D;0&#x60; and &#x60;count&#x3D;10&#x60;. To return the next ten negative keywords, set &#x60;startIndex&#x3D;10&#x60; and &#x60;count&#x3D;10&#x60;, and so on. (optional)
     * @param  \AmazonAdvertisingApi\Model\NegativeMatchType $match_type_filter The returned array is filtered to include only negative keywords with &#x60;matchType&#x60; set to one of the values in the specified comma-delimited list. (optional)
     * @param  string $keyword_text The returned array includes only negative keywords with the specified text. (optional)
     * @param  \AmazonAdvertisingApi\Model\State $state_filter The returned array includes only negative keywords with &#x60;state&#x60; set to the specified value. (optional)
     * @param  string $campaign_id_filter The returned array includes only negative keywords associated with campaigns matching those specified by identifier in the comma-delimited string. (optional)
     * @param  string $ad_group_id_filter The returned array includes only negative keywords associated with ad groups matching those specified by identifier in the comma-delimited string. (optional)
     * @param  string $keyword_id_filter The returned array includes only negative keywords with identifiers matching those specified in the comma-delimited string. (optional)
     * @param  \AmazonAdvertisingApi\Model\CreativeType $creative_type Filter by the type of creative the campaign is associated with. To get negative keywords associated with non-video campaigns specify &#x27;productCollection&#x27;. To get negative keywords associated with video campaigns, this must be set to &#x27;video&#x27;. Returns all negative keywords if not specified. (optional)
     *
     * @throws \AmazonAdvertisingApi\ApiException on non-2xx response
     * @throws \InvalidArgumentException
     * @return array of \AmazonAdvertisingApi\Model\SBNegativeKeyword[], HTTP status code, HTTP response headers (array of strings)
     */
    public function listNegativeKeywordsWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $start_index = '0', $count = null, $match_type_filter = null, $keyword_text = null, $state_filter = null, $campaign_id_filter = null, $ad_group_id_filter = null, $keyword_id_filter = null, $creative_type = null)
    {
        $returnType = '\AmazonAdvertisingApi\Model\SBNegativeKeyword[]';
        $request = $this->listNegativeKeywordsRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $start_index, $count, $match_type_filter, $keyword_text, $state_filter, $campaign_id_filter, $ad_group_id_filter, $keyword_id_filter, $creative_type);

        try {
            $options = $this->createHttpClientOption();
            try {
                $response = $this->client->send($request, $options);
            } catch (RequestException $e) {
                throw new ApiException(
                    "[{$e->getCode()}] {$e->getMessage()}",
                    $e->getCode(),
                    $e->getResponse() ? $e->getResponse()->getHeaders() : null,
                    $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null
                );
            }

            $statusCode = $response->getStatusCode();

            if ($statusCode < 200 || $statusCode > 299) {
                throw new ApiException(
                    sprintf(
                        '[%d] Error connecting to the API (%s)',
                        $statusCode,
                        $request->getUri()
                    ),
                    $statusCode,
                    $response->getHeaders(),
                    $response->getBody()
                );
            }

            $responseBody = $response->getBody();
            if ($returnType === '\SplFileObject') {
                $content = $responseBody; //stream goes to serializer
            } else {
                $content = $responseBody->getContents();
                if (!in_array($returnType, ['string','integer','bool'])) {
                    $content = json_decode($content);
                }
            }

            return [
                ObjectSerializer::deserialize($content, $returnType, []),
                $response->getStatusCode(),
                $response->getHeaders()
            ];

        } catch (ApiException $e) {
            switch ($e->getCode()) {
                case 200:
                    $data = ObjectSerializer::deserialize(
                        $e->getResponseBody(),
                        '\AmazonAdvertisingApi\Model\SBNegativeKeyword[]',
                        $e->getResponseHeaders()
                    );
                    $e->setResponseObject($data);
                    break;
            }
            throw $e;
        }
    }

    /**
     * Operation listNegativeKeywordsAsync
     *
     * Gets an array of negative keywords, filtered by optional criteria.
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  int $start_index Sets a zero-based offset into the requested set of negative keywords. Use in conjunction with the &#x60;count&#x60; parameter to control pagination of the returned array. (optional, default to 0)
     * @param  int $count Sets the number of negative keywords in the returned array. Use in conjunction with the &#x60;startIndex&#x60; parameter to control pagination. For example, to return the first ten negative keywords set &#x60;startIndex&#x3D;0&#x60; and &#x60;count&#x3D;10&#x60;. To return the next ten negative keywords, set &#x60;startIndex&#x3D;10&#x60; and &#x60;count&#x3D;10&#x60;, and so on. (optional)
     * @param  \AmazonAdvertisingApi\Model\NegativeMatchType $match_type_filter The returned array is filtered to include only negative keywords with &#x60;matchType&#x60; set to one of the values in the specified comma-delimited list. (optional)
     * @param  string $keyword_text The returned array includes only negative keywords with the specified text. (optional)
     * @param  \AmazonAdvertisingApi\Model\State $state_filter The returned array includes only negative keywords with &#x60;state&#x60; set to the specified value. (optional)
     * @param  string $campaign_id_filter The returned array includes only negative keywords associated with campaigns matching those specified by identifier in the comma-delimited string. (optional)
     * @param  string $ad_group_id_filter The returned array includes only negative keywords associated with ad groups matching those specified by identifier in the comma-delimited string. (optional)
     * @param  string $keyword_id_filter The returned array includes only negative keywords with identifiers matching those specified in the comma-delimited string. (optional)
     * @param  \AmazonAdvertisingApi\Model\CreativeType $creative_type Filter by the type of creative the campaign is associated with. To get negative keywords associated with non-video campaigns specify &#x27;productCollection&#x27;. To get negative keywords associated with video campaigns, this must be set to &#x27;video&#x27;. Returns all negative keywords if not specified. (optional)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Promise\PromiseInterface
     */
    public function listNegativeKeywordsAsync($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $start_index = '0', $count = null, $match_type_filter = null, $keyword_text = null, $state_filter = null, $campaign_id_filter = null, $ad_group_id_filter = null, $keyword_id_filter = null, $creative_type = null)
    {
        return $this->listNegativeKeywordsAsyncWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $start_index, $count, $match_type_filter, $keyword_text, $state_filter, $campaign_id_filter, $ad_group_id_filter, $keyword_id_filter, $creative_type)
            ->then(
                function ($response) {
                    return $response[0];
                }
            );
    }

    /**
     * Operation listNegativeKeywordsAsyncWithHttpInfo
     *
     * Gets an array of negative keywords, filtered by optional criteria.
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  int $start_index Sets a zero-based offset into the requested set of negative keywords. Use in conjunction with the &#x60;count&#x60; parameter to control pagination of the returned array. (optional, default to 0)
     * @param  int $count Sets the number of negative keywords in the returned array. Use in conjunction with the &#x60;startIndex&#x60; parameter to control pagination. For example, to return the first ten negative keywords set &#x60;startIndex&#x3D;0&#x60; and &#x60;count&#x3D;10&#x60;. To return the next ten negative keywords, set &#x60;startIndex&#x3D;10&#x60; and &#x60;count&#x3D;10&#x60;, and so on. (optional)
     * @param  \AmazonAdvertisingApi\Model\NegativeMatchType $match_type_filter The returned array is filtered to include only negative keywords with &#x60;matchType&#x60; set to one of the values in the specified comma-delimited list. (optional)
     * @param  string $keyword_text The returned array includes only negative keywords with the specified text. (optional)
     * @param  \AmazonAdvertisingApi\Model\State $state_filter The returned array includes only negative keywords with &#x60;state&#x60; set to the specified value. (optional)
     * @param  string $campaign_id_filter The returned array includes only negative keywords associated with campaigns matching those specified by identifier in the comma-delimited string. (optional)
     * @param  string $ad_group_id_filter The returned array includes only negative keywords associated with ad groups matching those specified by identifier in the comma-delimited string. (optional)
     * @param  string $keyword_id_filter The returned array includes only negative keywords with identifiers matching those specified in the comma-delimited string. (optional)
     * @param  \AmazonAdvertisingApi\Model\CreativeType $creative_type Filter by the type of creative the campaign is associated with. To get negative keywords associated with non-video campaigns specify &#x27;productCollection&#x27;. To get negative keywords associated with video campaigns, this must be set to &#x27;video&#x27;. Returns all negative keywords if not specified. (optional)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Promise\PromiseInterface
     */
    public function listNegativeKeywordsAsyncWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $start_index = '0', $count = null, $match_type_filter = null, $keyword_text = null, $state_filter = null, $campaign_id_filter = null, $ad_group_id_filter = null, $keyword_id_filter = null, $creative_type = null)
    {
        $returnType = '\AmazonAdvertisingApi\Model\SBNegativeKeyword[]';
        $request = $this->listNegativeKeywordsRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $start_index, $count, $match_type_filter, $keyword_text, $state_filter, $campaign_id_filter, $ad_group_id_filter, $keyword_id_filter, $creative_type);

        return $this->client
            ->sendAsync($request, $this->createHttpClientOption())
            ->then(
                function ($response) use ($returnType) {
                    $responseBody = $response->getBody();
                    if ($returnType === '\SplFileObject') {
                        $content = $responseBody; //stream goes to serializer
                    } else {
                        $content = $responseBody->getContents();
                        if ($returnType !== 'string') {
                            $content = json_decode($content);
                        }
                    }

                    return [
                        ObjectSerializer::deserialize($content, $returnType, []),
                        $response->getStatusCode(),
                        $response->getHeaders()
                    ];
                },
                function ($exception) {
                    $response = $exception->getResponse();
                    $statusCode = $response->getStatusCode();
                    throw new ApiException(
                        sprintf(
                            '[%d] Error connecting to the API (%s)',
                            $statusCode,
                            $exception->getRequest()->getUri()
                        ),
                        $statusCode,
                        $response->getHeaders(),
                        $response->getBody()
                    );
                }
            );
    }

    /**
     * Create request for operation 'listNegativeKeywords'
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  int $start_index Sets a zero-based offset into the requested set of negative keywords. Use in conjunction with the &#x60;count&#x60; parameter to control pagination of the returned array. (optional, default to 0)
     * @param  int $count Sets the number of negative keywords in the returned array. Use in conjunction with the &#x60;startIndex&#x60; parameter to control pagination. For example, to return the first ten negative keywords set &#x60;startIndex&#x3D;0&#x60; and &#x60;count&#x3D;10&#x60;. To return the next ten negative keywords, set &#x60;startIndex&#x3D;10&#x60; and &#x60;count&#x3D;10&#x60;, and so on. (optional)
     * @param  \AmazonAdvertisingApi\Model\NegativeMatchType $match_type_filter The returned array is filtered to include only negative keywords with &#x60;matchType&#x60; set to one of the values in the specified comma-delimited list. (optional)
     * @param  string $keyword_text The returned array includes only negative keywords with the specified text. (optional)
     * @param  \AmazonAdvertisingApi\Model\State $state_filter The returned array includes only negative keywords with &#x60;state&#x60; set to the specified value. (optional)
     * @param  string $campaign_id_filter The returned array includes only negative keywords associated with campaigns matching those specified by identifier in the comma-delimited string. (optional)
     * @param  string $ad_group_id_filter The returned array includes only negative keywords associated with ad groups matching those specified by identifier in the comma-delimited string. (optional)
     * @param  string $keyword_id_filter The returned array includes only negative keywords with identifiers matching those specified in the comma-delimited string. (optional)
     * @param  \AmazonAdvertisingApi\Model\CreativeType $creative_type Filter by the type of creative the campaign is associated with. To get negative keywords associated with non-video campaigns specify &#x27;productCollection&#x27;. To get negative keywords associated with video campaigns, this must be set to &#x27;video&#x27;. Returns all negative keywords if not specified. (optional)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Psr7\Request
     */
    protected function listNegativeKeywordsRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $start_index = '0', $count = null, $match_type_filter = null, $keyword_text = null, $state_filter = null, $campaign_id_filter = null, $ad_group_id_filter = null, $keyword_id_filter = null, $creative_type = null)
    {
        // verify the required parameter 'amazon_advertising_api_client_id' is set
        if ($amazon_advertising_api_client_id === null || (is_array($amazon_advertising_api_client_id) && count($amazon_advertising_api_client_id) === 0)) {
            throw new \InvalidArgumentException(
                'Missing the required parameter $amazon_advertising_api_client_id when calling listNegativeKeywords'
            );
        }
        // verify the required parameter 'amazon_advertising_api_scope' is set
        if ($amazon_advertising_api_scope === null || (is_array($amazon_advertising_api_scope) && count($amazon_advertising_api_scope) === 0)) {
            throw new \InvalidArgumentException(
                'Missing the required parameter $amazon_advertising_api_scope when calling listNegativeKeywords'
            );
        }

        $resourcePath = '/sb/negativeKeywords';
        $formParams = [];
        $queryParams = [];
        $headerParams = [];
        $httpBody = '';
        $multipart = false;

        // query params
        if ($start_index !== null) {
            $queryParams['startIndex'] = ObjectSerializer::toQueryValue($start_index, null);
        }
        // query params
        if ($count !== null) {
            $queryParams['count'] = ObjectSerializer::toQueryValue($count, null);
        }
        // query params
        if ($match_type_filter !== null) {
            $queryParams['matchTypeFilter'] = ObjectSerializer::toQueryValue($match_type_filter, null);
        }
        // query params
        if ($keyword_text !== null) {
            $queryParams['keywordText'] = ObjectSerializer::toQueryValue($keyword_text, null);
        }
        // query params
        if ($state_filter !== null) {
            $queryParams['stateFilter'] = ObjectSerializer::toQueryValue($state_filter, null);
        }
        // query params
        if ($campaign_id_filter !== null) {
            $queryParams['campaignIdFilter'] = ObjectSerializer::toQueryValue($campaign_id_filter, null);
        }
        // query params
        if ($ad_group_id_filter !== null) {
            $queryParams['adGroupIdFilter'] = ObjectSerializer::toQueryValue($ad_group_id_filter, null);
        }
        // query params
        if ($keyword_id_filter !== null) {
            $queryParams['keywordIdFilter'] = ObjectSerializer::toQueryValue($keyword_id_filter, null);
        }
        // query params
        if ($creative_type !== null) {
            $queryParams['creativeType'] = ObjectSerializer::toQueryValue($creative_type, null);
        }
        // header params
        if ($amazon_advertising_api_client_id !== null) {
            $headerParams['Amazon-Advertising-API-ClientId'] = ObjectSerializer::toHeaderValue($amazon_advertising_api_client_id);
        }
        // header params
        if ($amazon_advertising_api_scope !== null) {
            $headerParams['Amazon-Advertising-API-Scope'] = ObjectSerializer::toHeaderValue($amazon_advertising_api_scope);
        }


        // body params
        $_tempBody = null;

        if ($multipart) {
            $headers = $this->headerSelector->selectHeadersForMultipart(
                ['application/vnd.sbnegativekeyword.v3.2+json', 'application/vnd.sbnegativekeyword.v3+json']
            );
        } else {
            $headers = $this->headerSelector->selectHeaders(
                ['application/vnd.sbnegativekeyword.v3.2+json', 'application/vnd.sbnegativekeyword.v3+json'],
                []
            );
        }

        // for model (json/xml)
        if (isset($_tempBody)) {
            // $_tempBody is the method argument, if present
            $httpBody = $_tempBody;
            // \stdClass has no __toString(), so we should encode it manually
            if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') {
                $httpBody = \GuzzleHttp\json_encode($httpBody);
            }
        } elseif (count($formParams) > 0) {
            if ($multipart) {
                $multipartContents = [];
                foreach ($formParams as $formParamName => $formParamValue) {
                    $multipartContents[] = [
                        'name' => $formParamName,
                        'contents' => $formParamValue
                    ];
                }
                // for HTTP post (form)
                $httpBody = new MultipartStream($multipartContents);

            } elseif ($headers['Content-Type'] === 'application/json') {
                $httpBody = \GuzzleHttp\json_encode($formParams);

            } else {
                // for HTTP post (form)
                $httpBody = \GuzzleHttp\Psr7\Query::build($formParams);
            }
        }

            // // this endpoint requires Bearer token
            if ($this->config->getAccessToken() !== null) {
            $headers['Authorization'] = 'Bearer ' . $this->config->getAccessToken();
            }

        $defaultHeaders = [];
        if ($this->config->getUserAgent()) {
            $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
        }

        $headers = array_merge(
            $defaultHeaders,
            $headerParams,
            $headers
        );

        $query = \GuzzleHttp\Psr7\Query::build($queryParams);
        return new Request(
            'GET',
            $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''),
            $headers,
            $httpBody
        );
    }

    /**
     * Operation updateNegativeKeywords
     *
     * Updates one or more negative keywords.
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  \AmazonAdvertisingApi\Model\SbNegativeKeywordsBody[] $body An array of negative keywords. (optional)
     *
     * @throws \AmazonAdvertisingApi\ApiException on non-2xx response
     * @throws \InvalidArgumentException
     * @return \AmazonAdvertisingApi\Model\SBKeywordResponse[]
     */
    public function updateNegativeKeywords($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        list($response) = $this->updateNegativeKeywordsWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body);
        return $response;
    }

    /**
     * Operation updateNegativeKeywordsWithHttpInfo
     *
     * Updates one or more negative keywords.
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  \AmazonAdvertisingApi\Model\SbNegativeKeywordsBody[] $body An array of negative keywords. (optional)
     *
     * @throws \AmazonAdvertisingApi\ApiException on non-2xx response
     * @throws \InvalidArgumentException
     * @return array of \AmazonAdvertisingApi\Model\SBKeywordResponse[], HTTP status code, HTTP response headers (array of strings)
     */
    public function updateNegativeKeywordsWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        $returnType = '\AmazonAdvertisingApi\Model\SBKeywordResponse[]';
        $request = $this->updateNegativeKeywordsRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body);

        try {
            $options = $this->createHttpClientOption();
            try {
                $response = $this->client->send($request, $options);
            } catch (RequestException $e) {
                throw new ApiException(
                    "[{$e->getCode()}] {$e->getMessage()}",
                    $e->getCode(),
                    $e->getResponse() ? $e->getResponse()->getHeaders() : null,
                    $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null
                );
            }

            $statusCode = $response->getStatusCode();

            if ($statusCode < 200 || $statusCode > 299) {
                throw new ApiException(
                    sprintf(
                        '[%d] Error connecting to the API (%s)',
                        $statusCode,
                        $request->getUri()
                    ),
                    $statusCode,
                    $response->getHeaders(),
                    $response->getBody()
                );
            }

            $responseBody = $response->getBody();
            if ($returnType === '\SplFileObject') {
                $content = $responseBody; //stream goes to serializer
            } else {
                $content = $responseBody->getContents();
                if (!in_array($returnType, ['string','integer','bool'])) {
                    $content = json_decode($content);
                }
            }

            return [
                ObjectSerializer::deserialize($content, $returnType, []),
                $response->getStatusCode(),
                $response->getHeaders()
            ];

        } catch (ApiException $e) {
            switch ($e->getCode()) {
                case 207:
                    $data = ObjectSerializer::deserialize(
                        $e->getResponseBody(),
                        '\AmazonAdvertisingApi\Model\SBKeywordResponse[]',
                        $e->getResponseHeaders()
                    );
                    $e->setResponseObject($data);
                    break;
            }
            throw $e;
        }
    }

    /**
     * Operation updateNegativeKeywordsAsync
     *
     * Updates one or more negative keywords.
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  \AmazonAdvertisingApi\Model\SbNegativeKeywordsBody[] $body An array of negative keywords. (optional)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Promise\PromiseInterface
     */
    public function updateNegativeKeywordsAsync($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        return $this->updateNegativeKeywordsAsyncWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body)
            ->then(
                function ($response) {
                    return $response[0];
                }
            );
    }

    /**
     * Operation updateNegativeKeywordsAsyncWithHttpInfo
     *
     * Updates one or more negative keywords.
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  \AmazonAdvertisingApi\Model\SbNegativeKeywordsBody[] $body An array of negative keywords. (optional)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Promise\PromiseInterface
     */
    public function updateNegativeKeywordsAsyncWithHttpInfo($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        $returnType = '\AmazonAdvertisingApi\Model\SBKeywordResponse[]';
        $request = $this->updateNegativeKeywordsRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body);

        return $this->client
            ->sendAsync($request, $this->createHttpClientOption())
            ->then(
                function ($response) use ($returnType) {
                    $responseBody = $response->getBody();
                    if ($returnType === '\SplFileObject') {
                        $content = $responseBody; //stream goes to serializer
                    } else {
                        $content = $responseBody->getContents();
                        if ($returnType !== 'string') {
                            $content = json_decode($content);
                        }
                    }

                    return [
                        ObjectSerializer::deserialize($content, $returnType, []),
                        $response->getStatusCode(),
                        $response->getHeaders()
                    ];
                },
                function ($exception) {
                    $response = $exception->getResponse();
                    $statusCode = $response->getStatusCode();
                    throw new ApiException(
                        sprintf(
                            '[%d] Error connecting to the API (%s)',
                            $statusCode,
                            $exception->getRequest()->getUri()
                        ),
                        $statusCode,
                        $response->getHeaders(),
                        $response->getBody()
                    );
                }
            );
    }

    /**
     * Create request for operation 'updateNegativeKeywords'
     *
     * @param  string $amazon_advertising_api_client_id The identifier of a client associated with a **Login with Amazon** account. (required)
     * @param  string $amazon_advertising_api_scope The identifier of a profile associated with the advertiser account. Use &#x60;GET&#x60; method on Profiles resource to list profiles associated with the access token passed in the HTTP Authorization header. (required)
     * @param  \AmazonAdvertisingApi\Model\SbNegativeKeywordsBody[] $body An array of negative keywords. (optional)
     *
     * @throws \InvalidArgumentException
     * @return \GuzzleHttp\Psr7\Request
     */
    protected function updateNegativeKeywordsRequest($amazon_advertising_api_client_id, $amazon_advertising_api_scope, $body = null)
    {
        // verify the required parameter 'amazon_advertising_api_client_id' is set
        if ($amazon_advertising_api_client_id === null || (is_array($amazon_advertising_api_client_id) && count($amazon_advertising_api_client_id) === 0)) {
            throw new \InvalidArgumentException(
                'Missing the required parameter $amazon_advertising_api_client_id when calling updateNegativeKeywords'
            );
        }
        // verify the required parameter 'amazon_advertising_api_scope' is set
        if ($amazon_advertising_api_scope === null || (is_array($amazon_advertising_api_scope) && count($amazon_advertising_api_scope) === 0)) {
            throw new \InvalidArgumentException(
                'Missing the required parameter $amazon_advertising_api_scope when calling updateNegativeKeywords'
            );
        }

        $resourcePath = '/sb/negativeKeywords';
        $formParams = [];
        $queryParams = [];
        $headerParams = [];
        $httpBody = '';
        $multipart = false;

        // header params
        if ($amazon_advertising_api_client_id !== null) {
            $headerParams['Amazon-Advertising-API-ClientId'] = ObjectSerializer::toHeaderValue($amazon_advertising_api_client_id);
        }
        // header params
        if ($amazon_advertising_api_scope !== null) {
            $headerParams['Amazon-Advertising-API-Scope'] = ObjectSerializer::toHeaderValue($amazon_advertising_api_scope);
        }


        // body params
        $_tempBody = null;
        if (isset($body)) {
            $_tempBody = $body;
        }

        if ($multipart) {
            $headers = $this->headerSelector->selectHeadersForMultipart(
                ['application/vnd.sbkeywordresponse.v3+json']
            );
        } else {
            $headers = $this->headerSelector->selectHeaders(
                ['application/vnd.sbkeywordresponse.v3+json'],
                ['application/json']
            );
        }

        // for model (json/xml)
        if (isset($_tempBody)) {
            // $_tempBody is the method argument, if present
            $httpBody = $_tempBody;
            // \stdClass has no __toString(), so we should encode it manually
            if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') {
                $httpBody = \GuzzleHttp\json_encode($httpBody);
            }
        } elseif (count($formParams) > 0) {
            if ($multipart) {
                $multipartContents = [];
                foreach ($formParams as $formParamName => $formParamValue) {
                    $multipartContents[] = [
                        'name' => $formParamName,
                        'contents' => $formParamValue
                    ];
                }
                // for HTTP post (form)
                $httpBody = new MultipartStream($multipartContents);

            } elseif ($headers['Content-Type'] === 'application/json') {
                $httpBody = \GuzzleHttp\json_encode($formParams);

            } else {
                // for HTTP post (form)
                $httpBody = \GuzzleHttp\Psr7\Query::build($formParams);
            }
        }

            // // this endpoint requires Bearer token
            if ($this->config->getAccessToken() !== null) {
            $headers['Authorization'] = 'Bearer ' . $this->config->getAccessToken();
            }

        $defaultHeaders = [];
        if ($this->config->getUserAgent()) {
            $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
        }

        $headers = array_merge(
            $defaultHeaders,
            $headerParams,
            $headers
        );

        $query = \GuzzleHttp\Psr7\Query::build($queryParams);
        return new Request(
            'PUT',
            $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''),
            $headers,
            $httpBody
        );
    }

    /**
     * Create http client option
     *
     * @throws \RuntimeException on file opening failure
     * @return array of http client options
     */
    protected function createHttpClientOption()
    {
        $options = [];
        if ($this->config->getDebug()) {
            $options[RequestOptions::DEBUG] = fopen($this->config->getDebugFile(), 'a');
            if (!$options[RequestOptions::DEBUG]) {
                throw new \RuntimeException('Failed to open the debug file: ' . $this->config->getDebugFile());
            }
        }

        return $options;
    }
}
